package server;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.LinkedList;

import client.TFCliente;

import controlador.Controlador;
import controlador.Jugada;

public class TFServer extends RemoteServer{

	protected int nJugadores = 0;
	protected short modo;
	protected Controlador controlador = null;
	protected ArrayList<String> jugadores = null;
	protected ArrayList<String> alfabeto = null;
	protected ArrayList<String> letrasJugadas = null;
	protected Registry registry = null;
	
	public TFServer(){}
	public TFServer(Controlador controlador, int nJugadores, short modo){
		this.controlador = controlador;
		this.nJugadores = nJugadores;
		this.modo = modo;
		jugadores = new ArrayList<String>();
		alfabeto = new ArrayList<String>();
		letrasJugadas = new ArrayList<String>();
		
		for (int i=0; i<26; i++){
			char letra = (char) ('A' + i);
			alfabeto.add(Character.toString(letra));
		}
		
		if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
	}
	
	/**
	 * @param args
	 * @throws IOException 
	 * @throws NotBoundException 
	 */
	public void start() throws IOException, NotBoundException {
		
		String name = "Server";
        TFServer stub = (TFServer) UnicastRemoteObject.exportObject(this, 0);
        registry = LocateRegistry.getRegistry();
        registry.rebind(name, stub);
        
		while (jugadores.size() < nJugadores){
			/// Espera que se conecten todos 
		}
		
		// Obtiene una letra al azar
		int indiceChar = ((int) Math.random() * alfabeto.size());
		String randomChar = alfabeto.remove(indiceChar);
		
		// Agrega la letra a la lista de jugadas
		letrasJugadas.add(randomChar);
		
        for (String jugador : jugadores) {
        	// Recuepera la referencia de cada jugador remoto
            TFCliente cliente = (TFCliente) registry.lookup(jugador);
            cliente.cargarPantalla(randomChar);
		}
		// Carga la pantalla en el modo server
		controlador.cargarPantalla(randomChar);
		
	}
	
	public void addJugador(String nombre){
		jugadores.add(nombre);
	}
	
	public void terminarJugada(String nombre, Jugada jugada){
		
		for (String jugador : jugadores) {
        	
			// Recuepera la referencia de cada jugador remoto
            if (jugador != nombre){
            	TFCliente cliente;
				try {
					
					cliente = (TFCliente) registry.lookup(jugador);
					cliente.finalizarJugada(nombre);
					
				} catch (AccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NotBoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
            	
            }	
		}
	}

}
